4.7 查找位置与数据的查找判断
1、查找位置
s.str.find(sub,start=0,end=none)
s.str.index(sub,start=0,end=none)
sub :正在查找的子字符串
start :查找的起始位置
end :查找的结果位置
import pandas as pd
s=pd.Series([ "张三48李四97","王麻子32王五96","韩四99lily97" ])
t=s.str.find( "9" , start = 5 )
print (t)
返回:
0 | 6 |
1 | 7 |
2 | 8 |
dtype: int64
2、数据的查找判断
如果需要判断Series数据中是否有指定的字符,条件成立返回True,否则返回False,
(1)判断是否包含指定字符串用contains()函数,区分大小写,支持正则表达式,结构如下
pat :字符串或正则表达式
case :如果为True,则区分大小写,如果为False,则不区分
flags :re模块中的标志
na :缺失值的处理
regex :是否将pat参数视为正则表达式,True视为正则表达式,False视为普通字符。
import pandas as pd
s=pd.Series([ "123abc","123ABC","Abd1253" ])
t1=s.str.contains( "123" , True )
t2=s.str.contains( "abc" , case = False )
print (t1)
print (t2)
返回:
0 | True |
1 | True |
2 | False |
dtype: bool
0 | True |
1 | True |
2 | False |
dtype: bool
(2)用match()函数从头开始查找,区分大小写,支持正则表达式,结构如下
Pat :字符串或正则表达式
Case :如果为True,则区分大小写,如果为False,则不区分
flags :re模块中的标志
Na :缺失值的处理
import pandas as pd
s=pd.Series([ "123abc","123ABC","Abd1253" ,pd.NA])
t1=s.str.match( "123" , True )
t2=s.str.match( "\D+" ) # 可以用正则表达式
print (t1)
print (t2)
返回:
0 | True |
1 | True |
2 | False |
3 | <NA> |
dtype: object
0 | False |
1 | False |
2 | True |
3 | <NA> |
dtype: object
3、数据的查找应用
s.str.findall()函数:针对Series中的字符串做匹配,
re.findall()函数:对单独的字符串作匹配
函数 | 作用 | 是否支持正则 |
---|---|---|
s.str.find | 查找位置 | 否 |
s.str.index | 查找位置 | 否 |
s.str.contains | 查找判断 | 是 |
s.str.match | 查找判断 | 是 |
s.str.findall | 查找判断 | 是 |
import pandas as pd
test= "abc123de4fgdkl98ss"
s=pd.Series([ "123abc","123ABC","Abd1253" ,pd.NA])
t1=re.findall( "\d+" ,test)
t2=s.str.findall( "^\d+" ) # 可以用正则表达式
print (t1)
print (t2)
返回:
['123', '4', '98']
0 | [123] |
1 | [123] |
2 | [] |
3 | <NA> |
dtype: object
4、数据的查找应用实例
#统计每月成绩含有大于100的科目,如有,则达标
import pandas as pd,numpy as np
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.查找实例应用.xlsx" )
print (df)
df[ "是否达标" ]=df.iloc[:, 1 :].apply( lambda s:np.where (np.all(s.str.contains( "\d{3,}" )), "YES","NO" ), axis = 1 )
df1=df.iloc[:, 1 :].apply( lambda s:np.where (s.str.contains( "\d{3,}" ), "YES","NO" ), axis = 1 )
print (df)
print (df1)
# np.all判断整行Series
姓名 | 1月 | 2月 | 3月 | |
---|---|---|---|---|
0 | 张三 | 语89数120 | 语98数103 | 语105数86 |
1 | 李四 | 语67数87 | 语89数97 | 语88数93 |
2 | 王二 | 语78数126 | 语84数113 | 语86数136 |
3 | 麻子 | 语68数89 | 语123数128 | 语88数96 |
姓名 | 1月 | 2月 | 3月 | 是否达标 | |
---|---|---|---|---|---|
0 | 张三 | 语89数120 | 语98数103 | 语105数86 | YES |
1 | 李四 | 语67数87 | 语89数97 | 语88数93 | NO |
2 | 王二 | 语78数126 | 语84数113 | 语86数136 | YES |
3 | 麻子 | 语68数89 | 语123数128 | 语88数96 | NO |
0 | [YES, | YES, | YES, | YES] |
1 | [NO, | NO, | NO, | YES] |
2 | [YES, | YES, | YES, | YES] |
3 | [NO, | YES, | NO, | YES] |
dtype: object